#ifndef __MAP_BASE_H_
#define __MAP_BASE_H_


#include <opencv2/opencv.hpp>
// using namespace cv;

class MapBase{
    public:
        MapBase(){};
    
        // 设置地图数据
        void setOccupancyGrid(const OccupancyGridPtr& occupancy_grid_ptr);
        // 世界坐标转像素坐标
        Vec2i WorldToPixel(const Vec2f& point);
        // 世界坐标转像素坐标
        Vec2i WorldToOpencvPixel(const Vec2f& point);
        // 像素坐标转世界坐标
        Vec2f PixelToWorld(const Vec2i& point);
        // 像素坐标转世界坐标
        Vec2f OpencvPixelToWorld(const Vec2i& point);

        // 二维数据转一维
        size_t ToIndex(Vec2i pixel_2d);
        bool IsValid(Vec2i pixel_2d);
        bool IsValid(size_t idx);

        // 获取像素值，包含边界检测
        bool GetValue(Vec2i pixel_2d, int& value);
        // 数值是否有效
        bool ValueIsValid(Vec2i pixel_2d);

        // 简单膨胀处理
        void SimpleDilateOccupancyGrid(float robot_radius);
        void SimpleDilateOpencvMap(float robot_radius);

        // 获取地图数据
        bool getMap(cv::Mat& cv_map);
        bool getMap(nav_msgs::OccupancyGrid::Ptr& map_ptr, string frame_id);

    protected:
        OccupancyGridPtr occupancyGrid_;  // 地图数据
        cv::Mat cvMap_;         // 地图数据
        float resolution_;      // 地图分辨率
        int width_;             // 地图宽度
        int height_;            // 地图高度
        Vec2f origin_;          // 地图原点
        size_t mapSize_;       // 地图大小
        string frameId_;
};

#endif